﻿using System;
using System.Windows.Forms;
using Business;
using Business.Dicionary;
using Business.Entity.Contabil.Pessoa;
using Business.Entity.Contabil.Pessoa.SubClass.Fornecedor;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario.ClassesRelacionadas;
using Business.Forms;
using Business.Seguranca;
using Business.Validation;
using DevExpress.XtraEditors;


namespace Bonesoft.Forms.Contabil
{
    public partial class FormFornecedor : FormDefault, IForm
    {
        

        public FormFornecedor()
        {
            InitializeComponent();
            // Configuração dos botões para controle do formulario.
            cmdCancelar.Form = this;
            cmdExcluir.Form = this;
            cmdSalvar.Form = this;

            fornecedorBindingSource.DataSource = new Fornecedor();
            CurrentObject = fornecedorBindingSource.DataSource;
            listControlEndereco.FormEdit = new FormEndereco();
            listControlEnderecoEletronico.FormEdit = new FormEnderecoEletronico();
            listControlTelefone.FormEdit = new FormTelefone();
            // Carrega os enums
            tipoPessoaDicionaryBindingSource.DataSource = new TipoPessoaDicionary();
            sexoDicionaryBindingSource.DataSource = new SexoDicionary();
            InitFocusControl = cpfCnpjTextEdit;
        }

        private void aliasTextEdit_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void aliasLabel_Click(object sender, EventArgs e)
        {

        }

        public object Novo()
        {
            var f = new Fornecedor();
            CurrentObject = f;
            f.Pessoa.DataCadastro = DateTime.Now;
            tipoPessoaComboBoxEdit.Focus();
            ShowDialog();
            if (f.Id == 0)
            {
                return null;
            }
            return f;
        }

        public void Alterar(object entity)
        {
            CurrentObject = entity;
            tipoPessoaComboBoxEdit.Focus();
            ShowDialog();
        }

        private void cpfCnpjTextEdit_Leave(object sender, EventArgs e)
        {
            var fornecedor = FornecedorRepository.GetUniqueByCpfCnpj(cpfCnpjTextEdit.Text);
            if (fornecedor != null)
            {
                MessageBox.Show("Já existe um fornecedor cadastrado com esse CPF/CNPJ.");
                cpfCnpjTextEdit.Focus();
                return;
            }
            PessoaRepository.Session = FornecedorRepository.GetSession();
            var pessoa = PessoaRepository.GetUniqueByCpfCnpj(cpfCnpjTextEdit.Text);
            if (pessoa != null)
            {
                ((Fornecedor) fornecedorBindingSource.Current).Pessoa = pessoa;
            }
        }

        public object Save()
        {
            if (!Validate().HasError)
            {
                var f = (Fornecedor) CurrentObject;
                PessoaRepository.Session = FornecedorRepository.GetSession();
                PessoaRepository.Save(f.Pessoa);
                FornecedorRepository.Save(f);
            }
            return CurrentObject;
        }

        public void Update(object entity)
        {
            Alterar(entity);
        }

        public bool Delete(object entity)
        {
            CurrentObject = entity;
            FornecedorRepository.Delete((Fornecedor) entity);
            return true;
        }

        public object CurrentObject
        {
            get
            {
                return fornecedorBindingSource.DataSource;
            }
            set
            {
                fornecedorBindingSource.DataSource = value;
            }
        }

        public PermissaoForm Permissao
        {
            get
            {
                return SegurancaUtils.GetPermissaoForm(Name);
            }
        }

        public EntityValidationResult Validate()
        {
            var pessoa = ((Fornecedor) fornecedorBindingSource.DataSource).Pessoa;
            var result = DataValidation.ValidateEntity(pessoa);
            foreach (var valid in DataValidation.ValidateEntity((Fornecedor) CurrentObject).ValidationErrors)
            {
                result.ValidationErrors.Add(valid);
            }
            return result;
        }

        public void Reload()
        {
            
        }

        public void Cancel()
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

        public Object New()
        {
            return Novo();
        }

        public XtraForm Form
        {
            get
            {
                return this;
            }
        }

        public FormState FormState { get; set; }
    }
}